//xlang 
class Service {
    public static class Log{
        public static void d(String tag, String text){
            _system_.consoleWrite("Debug:" + tag + ":" + text + "\n");
            _system_.log(tag, _system_.LOG_LEV_DEBUG, text,  false);
            _system_.stdflush(_system_.STDOUT_NO);
        }
        public static void e(String tag, String text){
            _system_.consoleWrite("Error:" + tag + ":" + text + "\n");
            _system_.log(tag, _system_.LOG_LEV_ERR, text,  false);
            _system_.stdflush(_system_.STDOUT_NO);
        }
        public static void i(String tag, String text){
            _system_.consoleWrite("Info:" + tag + ":" + text + "\n");
            _system_.log(tag, _system_.LOG_LEV_INFO, text,  false);
            _system_.stdflush(_system_.STDOUT_NO);
        }
        public static void w(String tag, String text){
            _system_.consoleWrite("Warning:" + tag + ":" + text + "\n");
            _system_.log(tag, _system_.LOG_LEV_WARNING, text,  false);
            _system_.stdflush(_system_.STDOUT_NO);
        }
    };
    
    public static String ServiceName = "SVNProxyClient";
    public static String ServiceDisplayName = "Xlang SVNProxy Client";
    public static String ServiceDescription = "Proxy Client For SVN";
    
    public static bool bLocalRun = false;
    
    static ISystemSignalHandler _signalHandler = new ISystemSignalHandler(){
        public int onSignal(int si)override{
            if (si == _system_.SIGTERM){  onStop(); } // 收到终止信号
            if (si == _system_.SIGPWR){  onShutdown(); }// 收到关机信号
            return _system_.SIGNAL_SPREAD;  // 向后传播
        }
    };
    
    static void onStop(){}
    
    static void onShutdown(){onStop();}
    
	static bool install(){
		if (false == _system_.isServiceInstalled(ServiceName)){
			/** 安装服务 
			参数依次为
			可执行文件路径 _system_.getAppPath()
			服务名称			xlangsrv
			服务显示名称		Xlang Web Server
			服务描述
			@caution linux 下服务安装后可能需要手动使用 systemctl enable xlangsrv.service 命令对服务进行启用
			*/
			return _system_.installService(_system_.getAppPath(), ServiceName, ServiceDisplayName, ServiceDescription);
		}
        return false;
    }

	static bool uninstall(){
		if (true == _system_.isServiceInstalled(ServiceName)){
			/**  卸载服务 */
			return _system_.uninstallService(ServiceName);
		}
		return false;
    }
    
    static bool deamon(){
		String apppath = _system_.getAppPath();
		String []_args = {apppath};
		Process p = new Process(apppath, _args);
		return p.create(Process.Default);  
    }
    
    public static bool processArgs(String [] args){
		if (args.length > 1){
            switch (args[1]) {
            	case "install":install();       break; // 安装服务
                case "uninstall": uninstall();  break;    // 卸载服务
                case "start": deamon();         break;   // linux 服务器管理器用的, 不要手动使用
                case "run": bLocalRun = true;   return false ; //非服务模式下使用
            }
			return true;
		}
        return false;
    }
        
    public static void run(){
        /** 注册系统日志  */
        _system_.setupLogSource(ServiceName);
        /** 注册停止信号回调  */
        _system_.registrySystemSignalHandler(_system_.SIGTERM,_signalHandler,true);
        /** 注册关机信号回调  */
        _system_.registrySystemSignalHandler(_system_.SIGPWR,_signalHandler,true);
        new Thread(){
            void run()override{
                new BusinessClt().start();
            }
        }.start();
        _system_.serviceRun(ServiceName);
        /** 调试模式下如果服务未安装返回0则 使主线程睡眠 以便继续调试*/
        if (bLocalRun){
            Thread.sleep(-1);
        }
    }
};


int main(String [] args){
	/** 处理安装等参数, 如果不是处理参数  则运行服务*/
    if (false == BusinessClt.loadConfigure()){
        Service.Log.e(Service.ServiceName, "not found proxy_client.json or invalid proxy_client.json!");
        return 0;
    }
	if (false == Service.processArgs(args)){
		Service.run();
        _system_.exit(1);
    }
	return 0;
}
